/*
 * Bloque.cpp
 *
 */

#include "Bloque.h"

Bloque::Bloque(unsigned int tamBloque) {
	this->tamBloque = tamBloque;
	this->bufferBloque = "";

}

Bloque::Bloque() {
}

Bloque::~Bloque() {
}

unsigned int Bloque::obtenerBytesLibres() {
	unsigned int bytes;
	bytes= this->tamBloque-strlen(this->bufferBloque.c_str());

	return bytes;
}

int Bloque::agregarRegistro(Registro registro) {

	int longActualBloque;
	longActualBloque = strlen(this->bufferBloque.c_str());

	int longRegistro = strlen(registro.buffer.c_str());
	char* separador = "$";
	int longSeparador = strlen(separador);

	//Se valida que el bloque tenga espacio para guardar el registro
	if ((longActualBloque + longRegistro + longSeparador) <= this->tamBloque) {

		string cadena(this->bufferBloque);
		cadena.append(registro.buffer);
		cadena.append(separador);

		this->bufferBloque = cadena.c_str();

	} else {

		return -1;
	}
	return 0;
}


Registro* Bloque::obtenerRegistro(unsigned int pos){


	int cantReg = this->cantidadRegistros();
	//Si el nro de registro buscado es mayor a la cantidad de registros
	if (pos > cantReg){

		Registro* p_reg = new Registro ("");
		return p_reg;
	}

	string cadenaRet = "";
	unsigned int contadorReg = 0;
	int i = 0;
	int j = 0;
	int flag = 0;
	string cadena(this->bufferBloque);
	char c = cadena[i];
	int finCadena = cadena.size();
	//Se maneja el buffer del bloque como una cadena.
	//Mientras no se llegue a final de cadena y no se haya encontrado el registro buscado
	while( (i <= finCadena) && (flag == 0)){
		if (c == '$'){

			contadorReg++;
			//Si el registro buscado era el primero, lo guardo en la cadena a retornar
			if (pos == 1){
				cadenaRet = cadena.substr(0,i);//desde la primer pos de cadena hasta $
				flag = 1;
			}
			//Si el registro es el que sigue,guardo la pos de inicio del registro
			else if (contadorReg == (pos-1)){
				j = i+1;
			}
			//Guardo el registro desde la pos de inicio guardada en j, con tamaño i-j (pos fin - pos ini)
			else if (contadorReg == pos){
				cadenaRet = cadena.substr(j,(i-j));
				flag = 1;
			}
		}
		i++;
		c = cadena[i];
    }
	char *cstr = new char[cadenaRet.length() + 1];
	strcpy(cstr, cadenaRet.c_str());

	Registro* p_reg = new Registro (cstr);
//	delete [] cstr;
	return p_reg;

}

unsigned int Bloque::cantidadRegistros(){

	unsigned int contadorReg = 0;
	int i = 0;
	string cadena(this->bufferBloque);
	char c = cadena[i];
	int finCadena = cadena.size();
	while( i <= finCadena){
		if (c == '$'){
			contadorReg++;
		}
		i++;
		c = cadena[i];
    }
	return contadorReg;
}

void Bloque::completarConCeros(){
	string cadena(this->bufferBloque);
	char* cero = new  char('0');
	for (int i= cadena.size(); i<this->tamBloque;i++){
		cadena.append(cero);
	}
	this->bufferBloque = cadena.c_str();
	delete[] cero;
}

